﻿using CronosUtil;
using Devart.Data.SQLite;
using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using JMI_Nucleo.View.Form_Util;
using System;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace LocalTeste
{
    public partial class FrmLocal : Form
    {
        private string DiretorioArquivo = String.Empty;
        private int contador = 0;

        public FrmLocal()
        {
            InitializeComponent();

            DiretorioArquivo = ConfigurationManager.AppSettings.Get("PathArquivoNFe");
        }

        private void BtnSair_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void BtnExecutar_Click(object sender, EventArgs e)
        {
            string caminhoArquivo;

            caminhoArquivo = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            caminhoArquivo += "\\ConfigBD.xml";

            if (!File.Exists(caminhoArquivo))
            {
                FrmConfigConexao form = new FrmConfigConexao();
                form.ShowDialog();
            }

            FrmEmpresa frmEmpresa = new FrmEmpresa();
            frmEmpresa.lblTitulo.Text = "Cadastro de Empresas";
            frmEmpresa.ShowDialog();
        }

        private bool Existe(SQLiteConnection _conn, string str)
        {
            bool retorno = false;
            SQLiteCommand command = _conn.CreateCommand();
            command.CommandText = "SELECT * FROM ibge WHERE numero = " + str;
            SQLiteDataReader rs = command.ExecuteReader();
            if (rs.Read())
                retorno = true;
            rs.Close();
            return retorno;
        }

        private int TotalLinha()
        {
            int retorno = 0;
            Regex re = new Regex("\r\n");
            StreamReader fileReader = new StreamReader(Path.Combine(DiretorioArquivo, "TABIBGE.csv"));
            String stringReader = fileReader.ReadToEnd();
            fileReader.Close();
            fileReader.Dispose();
            retorno = re.Matches(stringReader).Count + 1;

            return retorno; 
        }
        private void GeraSQLIBGE()
        {            
            string arquivoLeitura, arquivoSQLite;
            string cmdSQL = String.Empty;
            string aux = String.Empty;
            arquivoLeitura = Path.Combine(DiretorioArquivo, "TABIBGE.csv");
            arquivoSQLite = Path.Combine(DiretorioArquivo, "ibge.db");
            SQLiteConnection conn = null;
            SQLiteTransaction transaction = null;
            SQLiteCommand cmd = null;

            if (File.Exists(arquivoLeitura))
            {
                StreamReader streamRead = new StreamReader(arquivoLeitura, Encoding.GetEncoding(CultureInfo.GetCultureInfo("pt-BR").TextInfo.ANSICodePage));

                try
                {
                    if (File.Exists(arquivoSQLite))
                        File.Delete(arquivoSQLite);
                    SQLiteConnection.CreateFile(arquivoSQLite);
                }
                catch (Exception ex)
                {
                    throw new Exception("Ocorreu um erro ao criar a base de dados.\n" + ex.Message);
                }

                conn = new SQLiteConnection();
                conn.DataSource = arquivoSQLite;
                conn.Open();

                cmd = conn.CreateCommand();

                cmdSQL = @"CREATE TABLE ibge(
                       ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
                       UF CHAR(2) NOT NULL,
                       DESCRICAOUF VARCHAR(45) NOT NULL,                       
                       MUNICIPIO VARCHAR(65),
                       NUMERO INTEGER NOT NULL
                   )";

                cmd.CommandText = cmdSQL;
                cmd.ExecuteNonQuery();
                cmd.Dispose();

                cmdSQL = @"CREATE UNIQUE INDEX idxNumero ON ibge (NUMERO)";
                cmd = conn.CreateCommand();
                cmd.CommandText = cmdSQL;
                cmd.ExecuteNonQuery();
                cmd.Dispose();

                string linha = null;

                cmdSQL = "INSERT INTO ibge (UF, DESCRICAOUF, MUNICIPIO, NUMERO) VALUES(?,?,?,?)";

                lblMensagem.Text = "Aguarde gerando base I.B.G.E do SQLite ...";
                lblMensagem.Update();
                progressBar1.Value = 0;
                progressBar1.Maximum = TotalLinha();
                progressBar1.Step = 1;
                while ((linha = streamRead.ReadLine()) != null)
                {
                    string[] coluna = linha.Split(';');
                    if (coluna[0] == "UF") { continue; }

                    if (Existe(conn, coluna[2])) { continue; }
                    contador++;
                    progressBar1.Value = contador;

                    try
                    {
                        transaction = conn.BeginTransaction();
                        cmd = conn.CreateCommand();
                        cmd.Parameters.Add("UF", DbType.String).Value = coluna[0];
                        aux = coluna[1];
                        cmd.Parameters.Add("DESCRICAOUF", DbType.String).Value = aux;
                        aux = coluna[3];
                        cmd.Parameters.Add("MUNICIPIO", DbType.String).Value = aux;
                        cmd.Parameters.Add("NUMERO", DbType.Int32).Value = Convert.ToInt32(coluna[2]);
                        cmd.CommandText = cmdSQL;
                        cmd.ExecuteNonQuery();
                        transaction.Commit();
                        cmd.Dispose();

                    }
                    catch (Exception ex)
                    {
                        if (transaction != null) transaction.Rollback();
                        throw new Exception("Ocorreu um erro ao inserir os dados na tabela.\n" + ex.Message);
                    }

                }
                streamRead.Close();
                conn.Close();
                lblMensagem.Text = "Processo finalizado com sucesso ...";
                lblMensagem.ForeColor = Color.Red;
            }
        }

        private void BtnGeraSQLiteIBGE_Click(object sender, EventArgs e)
        {
            mLog _info;

            #region Grava log local
            _info = new mLog();
            _info._TipoErro = TipoErro.Informacao;
            _info.Mensagem = "Carregando dados do IBGE ...";
            _info.Metodo = "private void FrmConIBGE_Load(object sender, EventArgs e)";
            _info.StackTrace = String.Empty;
            _info.Tabela = String.Empty;
            LogLocal.Info = _info;
            LogLocal.Gravar();
            #endregion
            this.Cursor = Cursors.WaitCursor;
            GeraSQLIBGE();
            this.Cursor = Cursors.Default;
            #region Grava log local
            _info = new mLog();
            _info._TipoErro = TipoErro.Informacao;
            _info.Mensagem = "Processo finalizado ...";
            _info.Metodo = "private void FrmConIBGE_Load(object sender, EventArgs e)";
            _info.StackTrace = String.Empty;
            _info.Tabela = String.Empty;
            LogLocal.Info = _info;
            LogLocal.Gravar();
            #endregion
        }

        private void BtnGravaLog_Click(object sender, EventArgs e)
        {
            mLog info = new mLog();

            info._TipoErro = TipoErro.Informacao;
            info.DataHora = DateTime.Now;
            info.Mensagem = "teste de gravação";
            info.Metodo = "private void BtnGravaLog_Click(object sender, EventArgs e)";
            info.StackTrace = "erro erro erro";
            info.Tabela = "logErro";

            LogLocal.Info = info;
            LogLocal.Gravar();
        }

        private void BtnGravaImagem_Click(object sender, EventArgs e)
        {
            Formulario002 frm = new Formulario002();
            frm.Titulo = "Formulário de Cadastro";
            frm.ShowDialog();
        }       
    }
}
